iT邦幫忙

2024 iThome 鐵人賽

DAY 4
3
自我挑戰組

AI救我系列 第 4

Day 4 - 在Python中使用 ABCD 矩陣追踪光線(1)

  • 分享至 

  • xImage
  •  

昨天稍微介紹了光線追跡用的ABCD Matrix,今天就來試試,和ChatGPT合作寫出能活用的程式碼。

前情提要:

https://ithelp.ithome.com.tw/upload/images/20240916/20168442VWmtqA9QJ1.png

情境設計:
初始光線[0, 0.1],X為0,弧度為0.1
第一個透鏡(凸):X為5,焦距為10
第二個透鏡(凹):X為10,焦距為-5

接下來使用 Python 進行計算:
(程式碼的部分我就不分段貼上,這樣大家可以一鍵複製到自己的編碼器上跑看看。)

import numpy as np
import matplotlib.pyplot as plt

# 定義ABCD矩陣
def abcd_matrix(A, B, C, D):
    return np.array([[A, B], [C, D]])

# 透鏡的ABCD矩陣 (焦距為 f 的薄透鏡)
def thin_lens(f):
    return abcd_matrix(1, 0, -1/f, 1)

# 傳播距離為 d 的介質ABCD矩陣
def propagation(d, n=1):  # n 是折射率
    return abcd_matrix(1, d/n, 0, 1)

# 初始光線狀態
incident_ray = np.array([0, 0.1])  # 位置 r = 0, 弧度 θ = 0.1 rad

# 定義光學系統
lens1 = thin_lens(10)  # 焦距為 10 的凸透鏡
medium = propagation(5)  # 傳播距離為 5 的介質
lens2 = thin_lens(-5)  # 焦距為 -5 的凹透鏡

# 光學系統中各點的光線狀態
rays = [incident_ray]

# 計算光線經過每個元件後的狀態
rays.append(np.dot(medium, rays[-1]))  # 介質
rays.append(np.dot(lens1, rays[-1]))  # 第1個透鏡
rays.append(np.dot(medium, rays[-1]))  # 介質
rays.append(np.dot(lens2, rays[-1]))  # 第2個透鏡

# 每個元件的位置
positions = [0, 5, 5, 10, 10]  # 每個元件的位置:光源-介質-凸透鏡-介質-凹透鏡-介質
#各段光線弧度
angles = [ray[1] for ray in rays]

#畫圖
plt.figure(figsize=(10, 6))
plt.plot(positions, angles, marker='o')

# 添加標籤,並指定字體屬性
plt.text(5, angles[1], 'Medium (D=5mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='cadetblue')
plt.text(5, angles[3], 'Lensvex 1 (focal=10mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='steelblue')
plt.text(10, angles[4], 'Lenscave 2 (focal=-5mm)', fontsize=6, fontfamily='serif', fontweight='bold', ha='left', color='cornflowerblue')

plt.title('Light Trace through Optical System', fontsize=16, fontfamily='serif', fontweight='bold')
plt.xlabel('Position (mm)', fontsize=14, fontfamily='serif')
plt.ylabel('Beam angle Displacement (r)', fontsize=14, fontfamily='serif')
plt.grid(True)
plt.show()

https://ithelp.ithome.com.tw/upload/images/20240916/201684424eiqB1vkXZ.png

以上是根據chatGPT給出的程式碼進行修正後畫出來的圖,顯示光線通過介質或透鏡後的位置與弧度。

其實一開始chatgpt給的程式碼內容是有誤,錯誤是出在對公式解釋有些問題,手動修改後今天就累惹QQ,我對於這樣的圖表不是很滿意,畢竟不直觀,明天再繼續做修改!


上一篇
Day 3 - ABCD 矩陣光線追跡法:追蹤光經過各種介質後的路線
下一篇
Day 5 - 在Python中使用 ABCD 矩陣追踪光線(2)
系列文
AI救我31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言